package bean;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.OutputStreamWriter;

/**
 * Descomprime um arquivo, segundo o algoritmo LZW
 * 
 * @author Anderson Almeida
 * @author Giovani Barbosa
 * 
 */
public class Descompressao extends LZW {
	/**
	 * Descomprime um arquivo qualquer, que tenha sido comprimido pelo programa
	 * Comprimir, dado o diretorio do arquivo compactado e o diretorio destino
	 * do arquivo descompactado.
	 * 
	 * @param entrada
	 *            O diretorio do arquivo compactado
	 * @param saida
	 *            O diretorio o qual ficara o arquivo descompactado
	 * @throws IOException
	 *             Caso o arquivo nao seja encontrado
	 */
	public void descomprime(String entrada, String saida) throws IOException {
		ObjectInputStream simbolos = new ObjectInputStream(new FileInputStream(
				entrada));
		OutputStreamWriter fileSaida = new OutputStreamWriter(
				new FileOutputStream(saida));
		int ultimoSimbolo = simbolos.readInt();
		fileSaida.write(dicionario.getValue(ultimoSimbolo));
		String anterior, atual = "";
		String add = "";

		while (simbolos.available() > 0) {
			int simboloAtual = simbolos.readInt();
			if (dicionario.getValue(simboloAtual) != null) {
				atual = dicionario.getValue(simboloAtual);
				anterior = dicionario.getValue(ultimoSimbolo);
				add = atual.substring(0, 1);
				dicionario.add(anterior + add);
				fileSaida.write(atual);
			} else {
				anterior = dicionario.getValue(ultimoSimbolo);
				add = anterior.substring(0, 1);
				fileSaida.write((anterior + add));
				dicionario.add(anterior + add);
			}
			ultimoSimbolo = simboloAtual;
		}
		simbolos.close();
		fileSaida.flush();
		fileSaida.close();

	}
}
